package ifes;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/*
  Verifica o verbete e a classe de uma palavra 
 */

public class Dic {

    public static void main(String[] args) {
        try {
            Dic d = new Dic("dic/");
            String palavra = "anta";
            String classe = d.getClasse(palavra);
            String verbete = d.getVerbete(palavra);

            System.out.println(palavra);
            System.out.println("Verbete: " + verbete);
            System.out.println("Classe: " + classe);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private String caminhoDicionario = "";
    private SAXParserFactory factory = SAXParserFactory.newInstance();
    private SAXParser saxParser;
    private DicHandler handler = new DicHandler();
    private HashMap<String, String> hashResultado;

    Dic(String caminhoDicionario) {
        try {
            this.caminhoDicionario = caminhoDicionario;
            saxParser = factory.newSAXParser();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    Dic() {
        try {
            saxParser = factory.newSAXParser();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void setPath(String caminhoDicionario) {
        this.caminhoDicionario = caminhoDicionario;
    }

    public String getClasse(String palavra) throws Exception {
        if (caminhoDicionario.equals("")) {
            throw new Exception("N?o h? caminho para o dicion?rio.");
        }
        if (hashResultado != null && (hashResultado.get("orth").split("\\+"))[0].equals(palavra)) {
            return hashResultado.get("gramGrp");
        }
        handler.setPalavra(palavra);

        saxParser.parse(caminhoDicionario + palavra.substring(0, 1).toUpperCase() + ".xml", handler);
        String resultado = handler.getResultado();
        hashResultado = montarHashResultado(resultado);
        return hashResultado.get("gramGrp");
    }

    public String getVerbete(String palavra) throws Exception {
        if (caminhoDicionario.equals("")) {
            throw new Exception("N?o h? caminho para o dicion?rio.");
        }
        if (hashResultado != null && (hashResultado.get("orth").split("\\+"))[0].equals(palavra)) {
            return hashResultado.get("def");
        }
        handler.setPalavra(palavra);

        saxParser.parse(caminhoDicionario + palavra.substring(0, 1).toUpperCase() + ".xml", handler);
        String resultado = handler.getResultado();
        hashResultado = montarHashResultado(resultado);
        return hashResultado.get("def");
    }

    private HashMap<String, String> montarHashResultado(String resultado) {
        String sresultado = resultado;
        String[] arr_resultado = sresultado.split("#");
        hashResultado = new HashMap<>();
        for (String s : arr_resultado) {
            String[] aux = s.split("@");
            if (hashResultado.containsKey(aux[0])) {
                hashResultado.put(aux[0], hashResultado.get(aux[0]) + "+" + aux[1]);
            } else {
                hashResultado.put(aux[0], aux[1]);
            }
        }
        return hashResultado;
    }
}

/*SEPARACAO DAS CLASSES FICA AQUI, ENTRE ESSE COMENT?RIO E O RESTO DO CODIGO*/
class DicHandler extends DefaultHandler {
    /*
     * Resultado = TAG@CONTEUDO#TAG@CONTEUDO#
     */

    private String resultado = "";
    private String palavra;
    private boolean bpalavra = false;
    private boolean borth = false;
    private String tag = "";
    private static List<String> tags = new ArrayList<>();
    private int indice = 0;

    public DicHandler() {
        super();
        tags.add("orth");
        tags.add("gramGrp");
        tags.add("def");
    }

    public void setPalavra(String palavra) {
        this.palavra = palavra;
    }

    public String getResultado() {
        return resultado;
    }

    @Override
    public void startElement(String uri, String localName, String qName, org.xml.sax.Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        if (bpalavra) {
            tag = qName;
        }
        if (qName.equalsIgnoreCase("orth")) {
            borth = true;
        }
        if (bpalavra && qName.equalsIgnoreCase("sense")) {
            indice++;
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
        if (qName.equalsIgnoreCase("entry")) {
            bpalavra = false;
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);
        StringBuilder sb = new StringBuilder();

        if (bpalavra) {
            sb.append(ch, start, length);
            String s = sb.toString();
            if (tags.contains(tag) && !s.equalsIgnoreCase("\n")) {
                s = s.replaceAll("\n", "");
                resultado += tag + "@[" + indice + "]" + s + "#";
            }
        }
        if (borth) {
            sb.append(ch, start, length);
            String s = sb.toString();
            if (s.equalsIgnoreCase(palavra)) {
                s = s.replaceAll("\n", "");
                resultado += "orth" + "@" + s + "#";
                bpalavra = true;
            }
            borth = false;
        }
    }
}